高通Android UEFI XBL 代码流程分析 您所在的位置:网站首页 uefi boot mode secure boot off翻译 高通Android UEFI XBL 代码流程分析

高通Android UEFI XBL 代码流程分析

2023-08-19 11:06| 来源: 网络整理| 查看: 265

高通Android UEFI XBL 代码流程分析 背景

之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构。

所以需要对这块比较新的技术进行学习。在学习之前,有必要了解一下高通UEFI启动流程。

原文(有删改):https://blog.csdn.net/Ciellee/article/details/113519478

参考文档:80_P2484_117_B_UEFI_With_XBL_On_MSM8998_SDM660_SDM

总览

先来看下SDM660芯片冷启动的流程。可以看出,在设备上电后,先跑的是 APPS PBL,接着运行XBL SEC、XBL Loader,通过Loader引出XBL CORE APPSBL,最后进入HLOS。

我们来看下这几个涉及的模块大概功能:

1、Application primary boot loader (APPS PBL)

PBL 启动时,CPU只开启了第一个核心 CPU Core 0,运行固件在ROM中,这部分是高通写死在芯片中的固件,外部开发人员是无法修改这部份的。

主要功能为: (1)系统安全环境的初始化,以确保后续的XBL中的APPS 能够正常运行。 (2)根据boot gpio的配置选择从什么设备启动操作系统(如 Nand,USB等)。 (3)通过检测GPIO判断是否进入Emergency Download mode,用户可以通过FILE来下载完整的系统镜像。 (4)通过L2 TCM来加载XBL1 ELF,OCIMEM 和 RPM CodeRAM 代码。

2、Extensible boot loader (XBL)

从XBL开始,跑的就是我们编译下载进eMMC/UFS的系统镜像了,在XBL中主要是初始化相关的硬件环境,及代码安全环境。

(1)初始化 Buses、DDR、Clocks、CDT,启动QSEE,QHEE,RPM_FW, XBL core images。 (2)使能memory dump through USB and Sahara(系统死机时memory dump),看门狗,RAM dump to SD support等功能。 (3)初始化 USB驱动,USB充电功能,温升检测,PMIC驱动初始化,和 DDR training模块。

3、XBL core (UEFI or LK,ABL)

XBL core,就是之前的bootloader,主要功能就是初始化display驱动,提供fastboot功能,引导进入HLOS kernel操作系统。

注意,在ABL中,同样也只有CPU Core0在工作,其他的CPU核以是在进入HLOS Kernel后才开始初始化启用的。

本文中,我们重点关注的是Extensible boot loader (XBL),主要来学学UEFI XBL架构,及UEFI XBL代码流程。

一、UEFI XBL 代码目录分析

UEFI XBL代码路径位于:BOOT.XF.1.4\boot_images\

# BOOT.XF.1.4\boot_images ArmPkg ----> ARM 架构相关的Protocols ArmPlatformPkg ----> ARM 开发板相关的UEFI代码 BaseTools ----> 编译EDK和EDK2相关的工具,如 EmbeddedPkg ----> FatPkg IntelFrameworkModulePkg IntelFrameworkPkg MdeModulePkg MdePkg QcomPkg ----> 高通定制的相关pkg,如display和usb充电都在里面 ShellPkg ----> UEFI shell 环境 UEFI代码运行流程

从图中可以看出,UEFI代码运行流程为:

SEC(安全验证)--->PEI(EFI前期初始化)--->DXE(驱动执行环境)--->BDS(启动设备选择)--->UEFI Loader(操作系统加载前期)--->RT(Run Time)。

接下来,我们根据这个流程来分析下UEFI代码。

SEC (安全验证)

SEC的汇编代码入口位于:

BOOT.XF.1.4\boot_images\QcomPkg\XBLCore\AARCH64\ModuleEntryPoint.masm的 _ModuleEntryPoint中

入口汇编代码分析

分析看看ModuleEntryPoint.masm 这个文件

该汇编代码中,主要工作为:

1、关闭所有中断

2、关闭MMU和Caches

3、关闭TLB缓存表

4、获得当前运行的安全环境:EL1、EL2、EL3

5、初始化ELX 安全环境

6、使能 Cache

7、初始化栈

8、调用 CEntryPoint,传参 _StackBase(0x80C00000)、_StackSize(0x00040000)

#include #include #include #include AREA |.text|,ALIGN=8,CODE,READONLY # BOOT.XF.1.4\boot_images\QcomPkg\XBLCore\AARCH64\ModuleEntryPoint.masm IMPORT CEntryPoint // 导入CEntryPoint()函数 EXPORT _ModuleEntryPoint // 输出 _ModuleEntryPoint段 IMPORT InitStackCanary // 导入InitStackCanary()函数 初始化栈 IMPORT ArmDisableInterrupts // 导入ArmDisableInterrupts()函数 禁用arm 中断 IMPORT ArmDisableCachesAndMmu // 导入ArmDisableCachesAndMmu()函数 禁用cache, mmu IMPORT ArmWriteCptr IMPORT ArmWriteHcr IMPORT ArmWriteVBar EXPORT _StackBase // 输出栈起始地址,起始地址为:0x80C00000 EXPORT _StackSize // 输出栈大小,栈大小为 0x00040000,256k EXPORT CNTFRQ // 输出时钟频率,19200000 //定义于: BOOT.XF.1.4\boot_images\QcomPkg\Sdm660Pkg\Common\Sdm660Pkg_Loader.dsc _StackBase dcq FixedPcdGet64(PcdPrePiStackBase) _StackSize dcq FixedPcdGet64(PcdPrePiStackSize) CNTFRQ dcq FixedPcdGet32(PcdArmArchTimerFreqInHz) _ModuleEntryPoint mov x0, #0 // 1、关闭所有中断 /* First ensure all interrupts are disabled */ bl ArmDisableInterrupts // 2、关闭MMU和Caches /* Ensure that the MMU and caches are off */ bl ArmDisableCachesAndMmu // 3、关闭TLB缓存表 /* Invalidate Instruction Cache and TLB */ bl ArmInvalidateInstructionCache bl ArmInvalidateTlb // 4、获得当前运行的安全环境:EL1、EL2、EL3 /* Get current EL in x0 */ EL1_OR_EL2_OR_EL3(x0) // CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1 // This only selects between EL1 and EL2 and EL3, else we die. // Provide the Macro with a safe temp xreg to use. //mrs x0, CurrentEL cmp x0, #0xC // 比较 x0寄存器是否为 0xc,如果是跳转到 标签3 beq %F3 cmp x0, #0x8 // 比较 x0寄存器是否为 0x8,如果是跳转到 标签2 beq %F2 cmp x0, #0x4 // 比较 x0寄存器是否为 0x4 bne 、 // We should never get here // EL1 code starts here 1 beq _Start 2 beq _Start // 如果当前是 EL2,直接跳转到_Start /* Do not trap any access to Floating Point and Advanced SIMD in EL3、*/ /* Note this works only in EL3, x0 has current EL mode */ 3 mov x0, #0 bl ArmWriteCptr // 如果当前是 EL3,直接跳转到ArmWriteCptr // msr cptr_el3, x0 // EL3 Coprocessor Trap Reg (CPTR) // 5、初始化ELX 安全环境 _SetupELx mov x0, #0x30 /* RES1 */ // x0 = 0x30 orr x0, x0, #(1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有